Codeforces Round 863 (Div. 3) |
您所在的位置:网站首页 › long int 和long › Codeforces Round 863 (Div. 3) |
这场的题目的质量真的超好!(真的是把我打傻了qwq) A Insert Digit题意:给定一个正整数和一个额外的数字d(0 \leq d \leq 9),将d插入到这个正整数中并使其结果尽可能大。 解法:从左到右遍历这个正整数的每一位,找到第一个小于d的位置,将其插入到该位置前面即可,如果找不到就将d放到最后。 #include using namespace std; typedef long long ll; typedef pair pii; #define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) #define cf(_) int _;cin >> _;while(_--) int main() { IOS; cf(_) { int n,t; string s; cin >> n >> t >> s; string res; bool ok = false; for(int i = 0;i解法: 这题还是挺思维的。将每个传送带看成每一层,将传送带上的点都映射到最左下角,然后层数之差的绝对值即为最终答案。 故问题转为如何找到这个最左下角的位置,由于对称性,对于任意一个点(x,y),其关于两个对角线对称后的其余三个点分别为:(y,x),(n - x + 1,n - y + 1),(n - y + 1,n - x + 1),则最左下角的坐标即为min({x,y,n - x + 1,n - y + 1}),代码如下: #include using namespace std; void solve() { int n,x1,y1,x2,y2; cin >> n >> x1 >> y1 >> x2 >> y2; cout sync_with_stdio(false); int t; cin >> t; while(t--) solve(); return 0; } C Restore the Array题意:已知长度为n - 1的数组b,其中: b_i=max(a_i,a_{i+1})b_i=max(a_i,a_{i+1}) (1 ≤ i ≤ n − 1) 。保证给定的数组b合法,请还原数组a满足上式,输出任意解即可。 解法:模拟去放的过程,先将a数组的最后两个数初始化为b[n - 1],从后往前跑一遍:如果当前位的b数组大于后一位的a数组,则直接将该位赋值为即可;否则如果较小的话,则同时将当前位和后一位赋值为(因为保证有解)。 #include using namespace std; void solve() { int n; cin >> n; vector b(n + 1),a(n + 1); for(int i = 1;i > b[i]; a[n] = a[n - 1] = b[n - 1]; for(int i = n - 2;i >= 1;i--) { if(b[i] >= a[i + 1]) a[i] = b[i]; else a[i] = a[i + 1] = b[i]; } for(int i = 1;i sync_with_stdio(false); int t; cin >> t; while(t--) solve(); return 0; } D Umka and a Long Flight题意: 给定一个长为F[n + 1],宽为F[n]的斐波那契矩形,你需要将这个矩阵分成n + 1个正方形,并满足: 1、已知被涂色的(x,y)小正方形方格的边长为1。 2、最多有两个正方形边长相等。 3、边长为斐波那契数。 解法: 显然,边长为1的小方格一定要用2个,剩下的就是用2,3,...n阶的斐波那契数去拼凑。 那么我们可以贪心地从大的开始放,假设给定的边长为1的小方格是如下黑色方格,则: 1、如果黑色小方格所处位置比矩形的宽F[n]大,则可以将左边的大方格切掉(边长为F[n]),剩余右边部分翻转一下(使其长在水平方向,宽在竖直方向),那么黑色方格的坐标需要进行变换:(x,y) -> (F[n + 1] - y + 1,x)。 2、如果黑色小方格所处位置比F[n - 1](要切去的右边大正方形边长为矩形的宽F[n],则左侧剩余部分长度就是F[n + 1] - F[n] = F[n - 1],即由斐波那契公式得出)要小,即黑色方格在大方格的左边,则“切掉”右边的大方格,并将左边剩余部分翻转一下(使其长在水平方向,宽在竖直方向),那么黑色方格的坐标就需要进行变换:由(x,y)-> (y,x)。 依次递归下去即可,代码如下: #include using namespace std; int F[50]; void init() { F[0] = F[1] = 1; for(int i = 2;i > n >> x >> y; function dfs = [&](int n,int x,int y) -> bool { if(!n) return true; if(y > F[n]) return dfs(n - 1,F[n + 1] - y + 1,x); else if(y sync_with_stdio(false); init(); // for(int i = 1;i n; ll l = 1,r = 1e18; while (l > 1; if(dp(mid) >= n) r = mid; else l = mid + 1; } cout > n; vector a; while (n) { a.push_back(n % 9); n /= 9; } for(int i = a.size() - 1;i >= 0;i--) cout sync_with_stdio(false); int t; cin >> t; while(t--) solve(); return 0; } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |